Fix memory leak in gdkscreen-x11
authorCarlos Garcia Campos <carlosgc@gnome.org>
Fri, 10 Apr 2009 04:14:23 +0000 (00:14 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 10 Apr 2009 04:14:23 +0000 (00:14 -0400)
When RandR 1.2 X driver doesn't return any usable multihead data the
monitors array is freed, without freeing the memory allocated by the array
elements before. Fixes bug #578354

gdk/x11/gdkscreen-x11.c

index 0bcb2bcdab45b06b63737d636483a96dec4c31c2..a2eaceaf3ae24863f5369aeb411dc36ac2839e2b 100644 (file)
@@ -663,6 +663,21 @@ init_fake_xinerama (GdkScreen *screen)
   return FALSE;
 }
 
+static void
+free_monitors (GdkX11Monitor *monitors,
+               gint           n_monitors)
+{
+  int i;
+
+  for (i = 0; i < n_monitors; ++i)
+    {
+      g_free (monitors[i].output_name);
+      g_free (monitors[i].manufacturer);
+    }
+
+  g_free (monitors);
+}
+
 static int
 monitor_compare_function (GdkX11Monitor *monitor1,
                           GdkX11Monitor *monitor2)
@@ -753,7 +768,11 @@ init_randr13 (GdkScreen *screen)
   /* non RandR 1.2 X driver doesn't return any usable multihead data */
   if (randr12_compat)
     {
-      g_array_free (monitors, TRUE);
+      guint n_monitors = monitors->len;
+
+      free_monitors ((GdkX11Monitor *)g_array_free (monitors, FALSE),
+                    n_monitors);
+
       return FALSE;
     }
 
@@ -856,21 +875,6 @@ init_xfree_xinerama (GdkScreen *screen)
   return FALSE;
 }
 
-static void
-free_monitors (GdkX11Monitor *monitors,
-               gint           n_monitors)
-{
-  int i;
-
-  for (i = 0; i < n_monitors; ++i)
-    {
-      g_free (monitors[i].output_name);
-      g_free (monitors[i].manufacturer);
-    }
-
-  g_free (monitors);
-}
-
 static void
 deinit_multihead (GdkScreen *screen)
 {